#include <iostream>
#include <cstdio>
//#include "test.h"
//1.缺省参数
//缺省参数只能从右向左缺省，对应的，参数传递由左向右依次传递
//声明和定义分离的情况下去，规定只能在声明处进行确实

//void func(int a,int b,int c);
//
//
//void func(int a,int b,int c=3)
//{
//  std::cout<<a<<":"<<b<<":"<<c<<std::endl;
//}
//void test1()
//{
//  func(1,2);
//  func(1,2,0);
//  funcTest();
//}


//2.缺省参数，功能无需多言。
//验证:C++和C语言中的不同->函数重载的机制，即
//int Add(int a,int b)
//{
//  return a+b;
//}
//
//double Add(double a,double b)
//{
//  return a+b;
//}



//引用:即给变量取'别名'
//1.引用必须被初始化 2.引用一旦被赋予一个实体，便不可再被改变 3.一个变量可以有多个引用
//void test4()
//{
//  int a=0;
//  int x=1;
//  //int& b;
//  int& b=a;
//  //int& b=x;
//  int& c=a;
//  std::cout<<&a<<std::endl;
//  std::cout<<&b<<std::endl;
//  std::cout<<&c<<std::endl;
//}

//引用的权限问题:const引用。 基本规则:引用只能权限缩小或者不变
//2.可以引用常量 3.发生算数转换的引用
//void test5()
//{
//  int x=0;
//  const int y=1;
//  int& a=x;
//  //int& b=y;
//  const int& b=y;
//  
//  const int& c=1;
//
//  double d=1.68;
//  int f=d;
//  //int& g=d;
//  const int& g=d;
//
//  printf("局部变量x:%p,引用a:%p\n",&x,&a);
//  printf("局部变量y:%p,引用b:%p\n",&y,&b);
//  printf("引用一个常量c:%p\n",&c);
//  printf("局部变量d:%p,引用g:%p\n",&d,&g);
//  printf("引用一个常量字符串:%p\n","hello world");
//
//
//}
//


//3.auto关键字
//1.auto定义的变量必须初始化 2.auto同一行声明多个变量时，必须是相同类型，auto实际只对第一个类型进行推导 3.auto不能作为函数的参数和返回值 4.auto不能直接用来声明数组
//auto func(int a=1)
//{
//  return 1;
//}
//
//void test6()
//{
//  //auto a;
//  auto a=1;
//  //auto b=1,c=2.2,d=3;
//  //auto arr[3]={1,2,3};
//  
//  //auto的使用场景:1.复杂类型时简化代码 2.范围for
//  int arr[]={1,2,3,4,5,6,7,8};
//  for(auto& e:arr)
//  {
//    e+=1;
//  }
//  for(auto f:arr)
//  {
//    std::cout<<f<<" ";
//  }
//  std::cout<<std::endl;
//}
//


//NULL和nullptr
void test7()
{
  void* p=(void*)0;
  int* ptr=(int*)p;
  std::cout<<p<<std::endl;
}

int main()
{
  test7();
  return 0;
}
